home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / BorderItems.C < prev    next >
C/C++ Source or Header  |  1990-12-20  |  6KB  |  265 lines

  1. //$AbstractBorderItem,BorderItem$
  2.  
  3. #include "BorderItems.h"
  4. #include "String.h"
  5.  
  6. //---- AbstractBorderItem ------------------------------------------------------
  7.  
  8. AbstractMetaImpl(AbstractBorderItem, (T(interiorOffset), T(extentDiff), T(border),
  9.     TP(interior), TP(titleBar), T(lineWidth), T(titleGap), T(shadowWidth), 0));
  10.  
  11. AbstractBorderItem::AbstractBorderItem(VObject *ti, VObject *in, int lw, int id)
  12.                         : CompositeVObject(id, in, ti, 0)
  13. {
  14.     interior= in;
  15.     titleBar= ti;
  16.     lineWidth= lw;
  17. }
  18.  
  19. AbstractBorderItem::AbstractBorderItem(char *ti, VObject *in, int lw, int id)
  20.             : CompositeVObject(id, in, 0)
  21. {
  22.     interior= in;
  23.     lineWidth= lw;
  24.     Add(titleBar= new TextItem(ti));
  25. }
  26.  
  27. Metric AbstractBorderItem::GetMinSize()
  28. {
  29.     Point e= interior->GetMinSize().extent;
  30.     
  31.     interiorOffset= border;
  32.     extentDiff= 2*interiorOffset + shadowWidth;
  33.     
  34.     if (titleBar) {
  35.     if (titleBar->IsKindOf(CompositeVObject))
  36.         ((CompositeVObject*)titleBar)->SetModified();
  37.     Metric tm= titleBar->GetMinSize();
  38.     tm.extent.x+= cHTitleGap*2;
  39.     tm.extent.y+= titleGap;
  40.     e.x= max(e.x, tm.extent.x);
  41.     interiorOffset.y+= tm.extent.y;
  42.     extentDiff.y+= tm.extent.y;
  43.     }
  44.     return e+extentDiff;
  45. }
  46.  
  47. void AbstractBorderItem::SetOrigin(Point at)
  48. {
  49.     VObject::SetOrigin(at);
  50.     interior->SetOrigin(at+interiorOffset);
  51.     if (titleBar) {
  52.     at.y+= border.y-1;
  53.     //if (titleBar->TestFlag(eVObjHFixed))
  54.         at.x+= (Width() - shadowWidth - titleBar->Width())/2;
  55.     //else
  56.     //    at.x+= border.x+cHTitleGap;
  57.     titleBar->SetOrigin(at);
  58.     }
  59. }
  60.  
  61. void AbstractBorderItem::SetExtent(Point e)
  62. {
  63.     VObject::SetExtent(e);
  64.     e-= extentDiff;
  65.     if (titleBar) {
  66.     if (titleBar->TestFlag(eVObjHFixed))
  67.         titleBar->CalcExtent();
  68.     else
  69.         titleBar->SetExtent(Point(e.x-cHTitleGap*2, interiorOffset.y-border.y));
  70.     }
  71.     interior->SetExtent(e);
  72. }
  73.  
  74. ostream& AbstractBorderItem::PrintOn(ostream &s)
  75. {
  76.     CompositeVObject::PrintOn(s);
  77.     return s << border SP << lineWidth SP << interiorOffset SP << extentDiff SP
  78.                         << interior SP << titleBar SP;
  79. }
  80.  
  81. istream& AbstractBorderItem::ReadFrom(istream &s)
  82. {
  83.     CompositeVObject::ReadFrom(s);
  84.     return s >> border >> lineWidth >> interiorOffset >> extentDiff >>
  85.                     interior >> titleBar;
  86. }
  87.  
  88. void AbstractBorderItem::SetTitle(char *itsTitle, bool redraw)
  89. {
  90.     if (titleBar == 0)
  91.     return;
  92.     
  93.     // ugly hack
  94.     VObject *tit= titleBar->FindItem(cIdWindowTitle);
  95.     if (tit == 0)
  96.     tit= titleBar;
  97.     if (tit && tit->IsKindOf(TextItem)) {
  98.     ((TextItem*)tit)->SetString(itsTitle);
  99.     tit->CalcExtent();
  100.     if (titleBar->IsKindOf(CompositeVObject))
  101.         ((CompositeVObject*)titleBar)->SetModified();
  102.     if (redraw && IsOpen()) {
  103.         Rectangle oldr= titleBar->contentRect;
  104.         titleBar->CalcExtent();
  105.         titleBar->SetExtent(oldr.extent);
  106.         titleBar->SetOrigin(oldr.origin);
  107.         InvalidateRect(oldr);
  108.     }
  109.     }
  110. }
  111.  
  112. char *AbstractBorderItem::GetTitle()
  113. {
  114.     if (titleBar == 0)
  115.     return 0;
  116.     
  117.     VObject *tit= titleBar->FindItem(cIdWindowTitle);
  118.     if (tit == 0)
  119.     tit= titleBar;
  120.     if (tit && tit->IsKindOf(TextItem))
  121.     return tit->AsString();
  122.     return 0;
  123. }
  124.  
  125. void AbstractBorderItem::InspectorId(char *buf, int sz)
  126. {
  127.     if (titleBar == 0)
  128.     return;
  129.     
  130.     VObject *tit= titleBar->FindItem(cIdWindowTitle);
  131.     if (tit && tit->IsKindOf(TextItem)) 
  132.     strn0cpy(buf, ((TextItem*)tit)->AsString(), sz);
  133. }
  134.  
  135. //---- BorderItem --------------------------------------------------------------
  136.  
  137. MetaImpl(BorderItem, (TE(titleAlign), 0));
  138.  
  139. BorderItem::BorderItem(VObject *ip, Point b, int lw, VObjAlign a)
  140.                 : AbstractBorderItem((VObject*)0, ip, lw, cIdNone)
  141. {
  142.     border= b;
  143.     titleAlign= a;
  144. }
  145.  
  146. BorderItem::BorderItem(VObject *ti, VObject *ip, Point b, int lw, VObjAlign a)
  147.                     : AbstractBorderItem(ti, ip, lw, cIdNone)
  148. {
  149.     border= b;
  150.     titleAlign= a;
  151. }
  152.  
  153. BorderItem::BorderItem(char *ti, VObject *ip, Point b, int lw, VObjAlign a)
  154.                     : AbstractBorderItem(ti, ip, lw, cIdNone)
  155. {
  156.     border= b;
  157.     titleAlign= a;
  158. }
  159.  
  160. BorderItem::BorderItem(int id, char *ti, VObject* ip, Point b, int lw, VObjAlign a)
  161.                     : AbstractBorderItem(ti, ip, lw, id)
  162. {
  163.     border= b;
  164.     titleAlign= a;
  165. }
  166.  
  167. void BorderItem::Draw(Rectangle r)
  168. {
  169.     if (! interior->contentRect.ContainsRect(r)) {
  170.     GrSetPenNormal();
  171.     if (lineWidth >= 0) {
  172.         GrSetPenSize(lineWidth);
  173.         if (! Enabled())
  174.         GrSetPenPattern(ePatGrey50);
  175.     }
  176.     if (titleBar) {
  177.         if (lineWidth >= 0) {
  178.         int h= titleBar->Height()/2;
  179.         Rectangle rr= contentRect;
  180.         rr.origin.y+= h;
  181.         rr.extent.y-= h;
  182.         GrStrokeRect(rr);
  183.         }
  184.         GrEraseRect(titleBar->contentRect);
  185.     } else if (lineWidth >= 0)
  186.         GrStrokeRect(contentRect);
  187.     GrSetPenNormal();
  188.     }
  189.     AbstractBorderItem::Draw(r);
  190. }
  191.  
  192. void BorderItem::SetOrigin(Point at)
  193. {
  194.     int lw= lineWidth >= 0 ? lineWidth : 0;  
  195.     VObject::SetOrigin(at);
  196.     if (titleBar) {
  197.     int th= titleBar->Height();
  198.     int tgap= border.x+lw+cBorderTitleGap;
  199.     titleBar->Align(Point(at.x+tgap, at.y), Metric(Width()-2*tgap, th),
  200.                 (VObjAlign)((titleAlign & eVObjH) | eVObjVTop));
  201.     int d= th - (border.y+lw);
  202.     if (d > 0)
  203.         at.y+= d;
  204.     }
  205.     interior->SetOrigin(at+border+Point(lw));
  206. }
  207.  
  208. Metric BorderItem::GetMinSize()
  209. {
  210.     int lw= lineWidth >= 0 ? lineWidth : 0;  
  211.     Metric m= interior->GetMinSize();
  212.     
  213.     if (titleBar) {
  214.     Metric tm= titleBar->GetMinSize();
  215.     m.extent.x= max(m.extent.x, tm.extent.x+2*cBorderTitleGap);
  216.     int d= tm.extent.y - (border.y+lw);
  217.     if (d > 0) {
  218.         m.extent.y+= d;
  219.         m.base+= d;
  220.     }
  221.     }
  222.     SetFlag(eVObjHFixed, interior->TestFlag(eVObjHFixed));
  223.     SetFlag(eVObjVFixed, interior->TestFlag(eVObjVFixed));
  224.     //SetFlag(eVObjVFixed);
  225.     return m.Expand(border+Point(lw));
  226. }
  227.  
  228. void BorderItem::SetExtent(Point e)
  229. {
  230.     int d= 0, lw= lineWidth >= 0 ? lineWidth : 0;  
  231.  
  232.     VObject::SetExtent(e);
  233.     if (titleBar) {
  234.     titleBar->CalcExtent();
  235.     d= titleBar->Height() - (border.y+lw);
  236.     if (d > 0)
  237.         e.y-= d;
  238.     }
  239.     interior->SetExtent(e-2*(border+Point(lw)));
  240. }
  241.  
  242. int BorderItem::Base()
  243. {
  244.     int d= 0, lw= lineWidth >= 0 ? lineWidth : 0;
  245.       
  246.     if (titleBar) {
  247.     d= titleBar->Height() - (border.y+lw);
  248.     if (d < 0)
  249.         d= 0;
  250.     }
  251.     return interior->Base()+d+border.y+lw;
  252. }
  253.  
  254. ostream& BorderItem::PrintOn(ostream &s)
  255. {
  256.     AbstractBorderItem::PrintOn(s);
  257.     return s << titleAlign SP;
  258. }
  259.  
  260. istream& BorderItem::ReadFrom(istream &s)
  261. {
  262.     AbstractBorderItem::ReadFrom(s);
  263.     return s >> Enum(titleAlign);
  264. }
  265.